package org.hang.gift.controller;


import org.hang.gift.domain.ShopCar;
import org.hang.gift.dto.AddShopCarDTO;
import org.hang.gift.dto.UpdateNumDTO;
import org.hang.gift.dto.UpdateSelectDTO;
import org.hang.gift.query.ShopCarQuery;
import org.hang.gift.service.IShopCarService;
import org.hang.util.AjaxResult;
import org.hang.util.PageList;
import org.hang.util.TenantIdName;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;
import java.util.Map;
import java.util.Objects;

@RestController
@RequestMapping("/shopCar")
public class ShopCarController {
    @Autowired
    public IShopCarService shopCarService;

    /**
     * 保存和修改公用的
     * @param shopCar  传递的实体
     * @return Ajaxresult转换结果
     */
    @PutMapping
    public AjaxResult addOrUpdate(@RequestBody ShopCar shopCar){
        try {
            if( shopCar.getId()!=null)
                shopCarService.updateById(shopCar);
            else
                shopCarService.insert(shopCar);
            return AjaxResult.me();
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setMessage("保存对象失败！"+e.getMessage());
        }
    }
    /**
    * 删除对象信息
    * @param id
    * @return
    */
    @DeleteMapping(value="/{id}")
    public AjaxResult delete(@PathVariable("id") Long id){
        try {
            shopCarService.deleteById(id);
            return AjaxResult.me();
        } catch (Exception e) {
        e.printStackTrace();
            return AjaxResult.me().setMessage("删除对象失败！"+e.getMessage());
        }
    }
	
    //获取用户
    @GetMapping("/{id}")
    public AjaxResult get(@PathVariable("id")Long id)
    {
        try {

            ShopCar shopCar = shopCarService.selectById(id);
            return AjaxResult.me().setResultObj(shopCar);
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setSuccess(false).setMessage("获取一个失败！"+e.getMessage());
        }
    }


    /**
    * 查看所有的员工信息
    * @return
    */
    @GetMapping
    public AjaxResult list(){

        try {
            List< ShopCar> list = shopCarService.selectList(null);
            return AjaxResult.me().setResultObj(list);
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setSuccess(false).setMessage("获取所有失败！"+e.getMessage());
        }
    }


    /**
    * 分页查询数据
    *
    * @param query 查询对象
    * @return PageList 分页对象
    */


    /**
     * 新增购物车需要哪些参数?
     *   userId - 在后端获取当前登录用户就可以
     *   skuId(  spuId  spuName skuInfo  price这些字段都在后端去数据库查询就可以了, 特别是价格,不能使用前端传过来的)
     *   num
     * @return
     */
    @PostMapping("/add")
    public AjaxResult addShopCar(@Valid @RequestBody AddShopCarDTO dto){
        shopCarService.addShopCar(dto);
        return AjaxResult.me();
    }

    /**
     * 参数:
     *   方式一: 购物车的ID
     *   方式二: skuId+userId
     *   num - 修改后的数量
     * @return
     */
    @PostMapping("/updateNum")
    public AjaxResult updateNum(@Valid @RequestBody UpdateNumDTO dto){
        shopCarService.updateNum(dto);
        return AjaxResult.me();
    }

    @PostMapping("/updateSelect")
    public AjaxResult updateSelect(@RequestBody UpdateSelectDTO dto){
        shopCarService.updateSelect(dto);
        return AjaxResult.me();
    }

    /**
     * 购物车的展示,同一个店铺的商品要展示在一起
     * Map<TenantIdName,List<ShopCar>>
     * @return
     */
    @GetMapping("/list/group")
    public AjaxResult listGroup(Long userId){
        // 前端是不需要传参的,后端获取当前登录人ID就可以,但是为了方便测试,因此给一个参数,如果前端不传,就在后端搞一个默认值
        userId = Objects.isNull(userId) ? 16L : userId;
        Map<TenantIdName,List<ShopCar>> map = shopCarService.listGroup(userId);
        return AjaxResult.me().setResultObj(map);
    }
}
